const express = require('express')
const router = express.Router()
const { DB } = require('../utils/db.js')
const jwt = require('jsonwebtoken');
const config = require('../config/index.js')
const { Redis } = require('../utils/redis')
const secretKey = config.secretKey; // 替换为实际的密钥
const { randomUUID } = require('crypto');

const {logger} = require('../middleware/error.js');
const { TryCatchSync, CheckRequiredParams } = require('../utils/index.js');



router.get('/', CheckRequiredParams(['name']), async (req, res) => {
 res.send('Hello World')
})
// 定义一个简单的路由
router.get('/user/:uid', async (req, res) => {
 const db = await DB('hello');
 const resData = await db.find('world', { sex: 1 })
 res.send(resData)

 // ! mongodb 4.0之前版本写法
 // MongoClient.connect('mongodb://localhost:27017/', (err, client) => {
 // 	if (err) {
 // 		console.error('连接 MongoDB 失败:', err)
 // 		return
 // 	}
 // 	const db = client.db('hello')
 // 	const collection = db.collection('world')
 // 	res.send(collection)
 // })
})

// 定义一个简单的路由
router.get('/test', async (req, res) => {
 TryCatchSync(res,()=>{
  let a = 10 / 0
  let b = a.test.x
  res.send("hello world")
 })

})

// 定义用户信息查询
router.post('/userInfo', async (req, res) => {
 const db = await DB('hello');
 const resData = await db.find('world', { _id: db.getObjectId(req.user.id) })
 if (resData.cood == 200) {
  res.send(resData.result[0])
 } else {
  res.send("wrong userInfo data is null")
 }
})

// 定义用户登录
router.post('/login',CheckRequiredParams(['username']), async (req, res) => {
 // 假设这里是用户登录的逻辑，验证用户名和密码
 const { username, password } = req.body;

 // 假设这里是验证用户身份的逻辑 当前没有通过账户密码验证
 const db = await DB('hello');
 const resData = await db.find('world', { account: "12324545456" })

 if (resData.cood == 200) {
  // 验证用户身份，如果验证通过
  // 生成 token
  // let id = randomUUID()  // 当前作假生成一个随机的 UUID 后续要数据库的用户id
  let id = resData.result[0]._id.toString()
  const token = jwt.sign({ username, id }, secretKey, { expiresIn: '8h' });

  // 将 token 返回给客户端
  res.json({ token });
  // 假设这里是将 token 保存到 Redis 中的逻辑

  const r = await Redis()
  let user = resData.result[0].user

  r.set(id, user)
 } else {
  res.status(401).json({ message: 'Wrong username or password' });
 }
})

// 定义用户登出
router.post('/loginOut', async(req, res) => {
 // 假设这里是用户登出的逻辑，清除用户的 token
 const r = await Redis()
 let userId = req.user.id
 
 // 假设这里是将 token 从 Redis 中删除的逻辑
 await r.Rd.del(userId)
 res.json({ message: 'Logout successful' });
})

// 注册用户 
router.post('/register', async (req, res)=> {
 // 假设这里是用户登录的逻辑，验证用户名和密码
 const { username, sex,age } = req.body;

 // 不检测账户名重复问题，直接插入数据
 const db = await DB('hello');
 let info = {
  account: Date.now().toString(36) + Math.random().toString(36).substr(2) ,
  username, sex,age
 }
 let last = await db.insert('world', info)
 if(last.cood!=200) res.status(401).json({ message: 'Regist failed' })
 else res.json({ message: 'Regist successful' });
})

// 可以定义更多的路由...

module.exports = router
